type ICallback = (arg: unknown) => unknown;
type ICallbacks = ICallback[]

interface IEvents {
  [key: string]: ICallbacks
}

function createEmitter() {

  /* 存储自定义事件内容
     容器结构:
     {
       事件名称eventName:【回调函数1，回调函数2】
     }
   */
  const events: IEvents = {}
  return {
    //绑定自定义事件
    //eventName 自定义事件名称
    on(eventName: string, callback: ICallback) {
      console.log("eventsevents3111", eventName);
      console.log("eventsevents3212", callback, JSON.stringify(callback));
      console.log("eventsevents3212", callback, typeof callback, !!(callback));
      if (typeof callback !== 'function') {
        console.error("Callback must be a function.");
        return;
      }
      if (events[eventName]) {
        events[eventName].push(callback) //第二次添加
      } else {
        events[eventName] = [callback]; //第一次添加
      }
      console.log("eventsevents", JSON.stringify(events));
    },
    //解绑自定义事件
    off(eventName: string, callback?: ICallback) {
      /*
       off("eventName") 解绑该事件 eventName 的所有回调函数
       off("eventName",cb) 解绑该事件eventName 的回调函数
      */
      const callbacks = events[eventName]
      if (!callbacks) {
        return
      }
      if (callbacks) {
        //比较函数是否相同 比较的是地址值
        events[eventName] = callbacks.filter(cb => cb !== callback)
      } else { //解绑所有事件
        delete events[eventName]
      }
    },
    //触发自定义事件
    // eventName 自定义事件名称 arg 自定义事件回调函数的参数
    emit(eventName: string, arg?: unknown) {
      const callbacks = events[eventName]
      console.log("eventseventslbacks", callbacks);
      if (!callbacks) {
        return
      }
      //遍历所有函数 一一执行
      callbacks.forEach(cb => cb(arg));
      // for (let i = callbacks.length - 1; i >= 0; i--) {
      //   let cd = callbacks.length[i]
      //   cd = cd(arg)
      // }
    },
  }

}

const globalEmitter = createEmitter()

export default globalEmitter